package org.geek.seckill.service;

import org.geek.seckill.dto.Exposer;
import org.geek.seckill.dto.SeckillExecution;
import org.geek.seckill.entity.Seckill;
import org.geek.seckill.exception.RepeatKillException;
import org.geek.seckill.exception.SeckillCloseException;
import org.geek.seckill.exception.SeckillException;

import java.util.List;

/**
 * 业务接口：站在“使用者”角度设计接口
 * 三个方面：方法定义粒度，参数，返回类型（return 类型/异常）
 * @author simple
 */
public interface SeckillService {

    /**
     * 查询所有秒杀记录
     *
     * @return
     */
    List<Seckill> getSeckillList();

    /**
     * 查询单个秒杀记录
     *
     * @param seckillId
     * @return
     */
    Seckill getById(int seckillId);

    /**
     * 秒杀开启时输出秒杀接口地址
     * 否则输出系统时间和秒杀时间
     *
     * @param seckillId
     * @return Exposer
     */
    Exposer exportSeckillUrl(int seckillId);

    /**
     * 执行秒杀操作
     *
     * @param seckillId 秒杀的产品id
     * @param userPhone 用户的手机号
     * @param md5 md5
     * @return SeckillExecution 秒杀对象
     * @exception SeckillException 秒杀异常
     * @exception RepeatKillException 重复秒杀异常
     * @exception SeckillCloseException 秒杀关闭异常
     */
    SeckillExecution executeSeckill(int seckillId, String userPhone, String md5)
            throws SeckillException, RepeatKillException, SeckillCloseException;

    /**
     * 执行秒杀操作By存储过程
     *
     * @param seckillId
     * @param userPhone
     * @param md5
     * @return SeckillExecution
     */
    SeckillExecution executeSeckillProcedure(int seckillId, String userPhone, String md5);
}
